package cn.wolfcode.wolf2w.auth.service;

import cn.wolfcode.wolf2w.common.core.constant.CacheConstants;
import cn.wolfcode.wolf2w.common.core.exception.ServiceException;
import cn.wolfcode.wolf2w.common.redis.service.RedisService;
import cn.wolfcode.wolf2w.common.security.utils.SecurityUtils;
import cn.wolfcode.wolf2w.member.api.domain.UserInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * 登录密码方法
 *
 * @author ruoyi
 */
@Component
public class PcPasswordService {
    @Autowired
    private RedisService redisService;

    private int maxRetryCount = CacheConstants.passwordMaxRetryCount;

    private Long lockTime = CacheConstants.passwordLockTime;


    /**
     * 登录账户密码错误次数缓存键名
     *
     * @param phone 用户名
     * @return 缓存键key
     */
    private String getCacheKey(String phone) {
        return CacheConstants.PWD_ERR_CNT_KEY +phone;
    }

/**
 * 验证用户密码并处理登录尝试次数限制
 * @param user 用户信息对象
 * @param password 待验证的密码
 * @throws ServiceException 当密码错误次数过多或密码验证失败时抛出
 */
    public void validate(UserInfo user, String password) {
    // 获取用户手机号
        String phone = user.getPhone();

    // 从Redis中获取该手机号的登录失败次数
        Integer retryCount = redisService.getCacheObject(getCacheKey(phone));

    // 如果缓存中没有记录，则初始化失败次数为0
        if (retryCount == null) {
            retryCount = 0;
        }

    // 检查失败次数是否超过最大允许次数
        if (retryCount >= Integer.valueOf(maxRetryCount).intValue()) {
        // 构造账户锁定提示信息
            String errMsg = String.format("密码输入错误%s次，帐户锁定%s分钟", maxRetryCount, lockTime);
        // 抛出服务异常，提示账户已锁定
            throw new ServiceException(errMsg);
        }

    // 验证用户密码是否匹配
        if (!matches(user, password)) {
        // 增加失败次数
            retryCount = retryCount + 1;
        // 将新的失败次数存入Redis，并设置锁定时间
            redisService.setCacheObject(getCacheKey(phone), retryCount, lockTime, TimeUnit.MINUTES);
        // 抛出服务异常，提示用户不存在或密码错误
            throw new ServiceException("用户不存在/密码错误");
        } else {
        // 密码验证成功，清除登录记录缓存
            clearLoginRecordCache(phone);
        }
    }

/**
 * 验证用户密码是否匹配
 * @param user 用户信息对象，包含加密后的密码
 * @param rawPassword 用户输入的原始密码
 * @return 如果密码匹配返回true，否则返回false
 */
    public boolean matches(UserInfo user, String rawPassword) {
    // 调用SecurityUtils类的matchesPassword方法进行密码匹配验证
    // 将用户输入的原始密码与数据库中存储的加密密码进行比较
        return SecurityUtils.matchesPassword(rawPassword, user.getPassword());
    }


    public void clearLoginRecordCache(String phone) {
        if (redisService.hasKey(getCacheKey(phone))) {
            redisService.deleteObject(getCacheKey(phone));
        }
    }
}
